<!--
========================================================================
 *  Copyright by KNIME AG, Zurich, Switzerland
 *  Website: http://www.knime.com; Email: contact@knime.com
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License, Version 3, as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, see <http://www.gnu.org/licenses>.
 *
 *  Additional permission under GNU GPL version 3 section 7:
 *
 *  KNIME interoperates with ECLIPSE solely via ECLIPSE's plug-in APIs.
 *  Hence, KNIME and ECLIPSE are both independent programs and are not
 *  derived from each other. Should, however, the interpretation of the
 *  GNU GPL Version 3 ("License") under any applicable laws result in
 *  KNIME and ECLIPSE being a combined program, KNIME AG herewith grants
 *  you the additional permission to use and propagate KNIME together with
 *  ECLIPSE with only the license terms in place for ECLIPSE applying to
 *  ECLIPSE and the GNU GPL Version 3 applying for KNIME, provided the
 *  license terms of ECLIPSE themselves allow for the respective use and
 *  propagation of ECLIPSE together with KNIME.
 *
 *  Additional permission relating to nodes for KNIME that extend the Node
 *  Extension (and in particular that are based on subclasses of NodeModel,
 *  NodeDialog, and NodeView) and that only interoperate with KNIME through
 *  standard APIs ("Nodes"):
 *  Nodes are deemed to be separate and independent programs and to not be
 *  covered works.  Notwithstanding anything to the contrary in the
 *  License, the License does not apply to Nodes, you are not required to
 *  license Nodes under the License, and you are granted a license to
 *  prepare and propagate Nodes, in each case even if such Nodes are
 *  propagated with or for interoperation with KNIME.  The owner of a Node
 *  may freely choose the license terms applicable to such Node, including
 *  when such Node is propagated with or for interoperation with KNIME.
====================================================================
-->
<body>
Contains all filters currently implemented for the row filter node. <p>

There is one base class <code>RowFilter</code> (see RowFilter.java) all filters
must be derived from. It forces you to implement three functions for each new
row filter: <br>
<code>matches</code>, which returns a boolean result indicating whether or not 
to include the row into the result,<br>
<code>saveSettings</code>, a method saving the filter's settings into a config 
object, and<br>
<code>loadSettingsFrom</code> which should read the settings from a config
object. <p>

In order to recreate a filter from a given config object there exists a
rowfilter factory (see <code>RowFilterFactory</code>). The abstract RowFilter
adds an identifier string to the config object (before it delegates the
actual saving of the settings to the derived class) and the factory reads
this ID string (at loading time) to create the corresponding filter class. 
As a consequence of this, each new filter must be registered with the
<code>RowFilterFactory</code>. The wheres and hows can be easily figured
out by looking at the comments in RowFilterFactory.java and to look at the
existing examples there.

Filters must decide in the <code>matches</code> method if a row should be
included (result <code>true</code>) or filtered out (result <code>false</code>)
from the result table. For that the entire row and the row number is passed to
this function. However, if a filter can already tell the result for the current 
row and all following rows, it can throw an exception and will not be bothered
for any more rows. There is a <code>EndOfTableException</code> and a 
<code>IncludeFromNowOn</code> exception which can be thrown to exclude/include 
resp. the current and all following rows. 
</body>
